package ar.edu.untref.robotica.control;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import ar.edu.untref.robotica.simulador.Simulador;

public class ConexionRemota extends ModuloDeControl {

	private BufferedReader entrada;
	private PrintWriter salida;

	public ConexionRemota(Simulador simulador) {

		super(simulador);

		try {

			iniciarServidor();
			iniciarConversacion();

		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private void iniciarServidor() throws IOException {

		int puerto = 8888;
		@SuppressWarnings("resource")
		ServerSocket server = new ServerSocket(puerto);

		// El sistema se detiene en esta línea, hasta que se reciba la conexión
		System.out.println("Esperando conexión por parte del cliente...");
		Socket cliente = server.accept();

		entrada = new BufferedReader(new InputStreamReader(
				cliente.getInputStream()));
		salida = new PrintWriter(cliente.getOutputStream(), true);
	}

	private void iniciarConversacion() throws IOException {

		System.out.println("Se ha conectado un cliente...");
		salida.println("Conectado al Simulador, por favor ingrese el comando que desea ejecutar.");

		String input = null;

		while ((input = entrada.readLine()) != null) {

			if (input.length() == 1) {

				char caracter = input.charAt(0);

				switch (caracter) {

				case 'w':
					avanzar();
					break;
				case 'x':
					frenar();
					break;
				case 's':
					retroceder();
					break;
				case 'd':
					girarDerecha();
					break;
				case 'a':
					girarIzquierda();
					break;
				case 'g':
					acelerarRuedaIzquierda();
					break;
				case 'b':
					desacelerarRuedaIzquierda();
					break;
				case 'h':
					acelerarRuedaDerecha();
					break;
				case 'n':
					desacelerarRuedaDerecha();
					break;
				case '+':
					agrandarPantalla();
					break;
				case '-':
					achicarPantalla();
					break;
				case 'i':
					sensarAdelante();
					break;
				case 'k':
					sensarAtras();
					break;
				case 'j':
					sensarIzquierda();
					break;
				case 'l':
					sensarDerecha();
					break;
				}
			}

			// Comando para salir
			if (input.equalsIgnoreCase("exit")) {
				System.out.println("El usuario se ha desconectado del Simulador, cerrando Servidor...");
				frenar();
				break;
			
			} else if(input.equalsIgnoreCase("vel")) {
				salida.println("Rueda Izquierda: " + getSimulador().getRobot().getRuedaI().getVelocidad().doubleValue());
				salida.println("Rueda Derecha: " + getSimulador().getRobot().getRuedaD().getVelocidad().doubleValue());
			
			} else if(input.equalsIgnoreCase("pos")) {
				
				salida.println("("
						+ getSimulador().getEscenario().getPosicionRobot().getPosicionX() + " ; "
						+ getSimulador().getEscenario().getPosicionRobot().getPosicionY()
						+ ")");
			}
			

		}

	}

}